minilctf2020 write up for easycpp
萌新做的第一道堆题…
0x00.安全检查
首先是惯例的checksec
只开了NX保护,四舍五入等于没有
0x01.程序分析
拖入IDA进行分析
用到了一个名为B
的类,我们先看看这个类都有些啥
IDA中类B有一个构造函数B()
和一个print()
函数
类B的构造函数如下:
类B的构造函数首先调用了类A的构造函数,然后将变量_vptr_A设置为一个函数指针
我们不难看到在0x80489E4位置上我们还需要再跳转一次到0x80488F2的位置,这个位置上有一个B::print()
函数,故可知这是一个二级函数指针
我们再来看看类A的构造函数,如下:
类A的构造函数也是将变量_vptr_A
设置为一个函数指针
位于off_80489F0上的函数为A::print()
接下来是main函数的简单分析:
v3、v4都是一个类型为类 B
的指针
首先setvbuf()
函数将程序设置为无缓冲输入
之后创建了一个类B的实例并将地址给到指针v3和v4
之后将该实例内的变量_vptr_A
的值设为0
之后使用delete释放掉之前分配给v3、v4的内存
之后从标准输入流读入1024个字节到buf(或许有操作空间?)
之后调用strbuf()
函数重新分配一段内存空间并将buf的值拷贝一份(当然最后并没有指针接收这一块内存,那么它会成为野内存吗?)
最后重新调用v4的函数指针变量所指向的函数
那么我们在这里就可以发现一个漏洞:
0x02.漏洞利用 - Use After Free
v3、v4所指向的内存空间被释放后v3、v4并没有被设置为NULL,在运行到strdup()函数时这一块内存空间又被重新分配给strdup()函数,而之后又通过v4再次对这一块内存空间进行调用,很明显存在UAF(Use After Free)漏洞
同时我们可以发现存在一个backdoor()
函数直接调用了system("/bin/sh")
,可以直接getshell
故我们只需要覆写掉函数指针所指的函数为backdoor()函数即可getshell
构造二级指针的结构应为
buf | buf+4 |
---|---|
右边那一块的地址 -> | 指向backdoor函数的地址 |
buf的地址如下:
故得exp如下
1 | from pwn import * |
向服务器发送payload,成功getsgell
可能是因为一些奇奇怪怪的原因,
cat flag
出来的flag不对
minilctf2020 write up for easycpp
http://meteorpursuer.github.io/2021/01/18/minilctf2020 write up for easycpp/